package controlador;

import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JFrame;

import javax.swing.table.AbstractTableModel;




import modelo.*;

import vista.DlgOrden;

public class ContOrden {
	private class Detalle {
		public Detalle(Producto pr, int cant) {
			producto = pr;
			cantidad = cant;
		}
		
		Producto producto;
		int cantidad;
	}
	
	private DlgOrden dlg = null;
	private ArrayList<Detalle> lista = new ArrayList<Detalle>();
	private AbstractTableModel tmodelo = null;
	private double total;
	
	public ContOrden() {
	}
	
	public void mostrar(JFrame frame) {
		dlg = new DlgOrden(frame, this);
		dlg.setLocationRelativeTo(null);
		dlg.getTblProductos().setSelectionMode(0);
		
		tmodelo = new AbstractTableModel() {
			private static final long serialVersionUID = 1L;

			@Override
			public int getColumnCount() {
				return 4;
			}

			@Override
			public String getColumnName(int col) {
				switch (col) {
				case 0: return "Producto";
				case 1: return "Precio";
				case 2: return "Cantidad";
				case 3: return "Total";
				}
				
				return null;
			}

			@Override
			public int getRowCount() {
				return lista.size();
			}

			@Override
			public Object getValueAt(int row, int col) {
				Detalle obj = lista.get(row); 
				switch (col) {
				case 0: return obj.producto.getNombre();
				case 1: return String.format("%.2f", obj.producto.getPrecio());
				case 2: return obj.cantidad;
				case 3: return String.format("%.2f", obj.producto.getPrecio() * obj.cantidad);
				}
				return null;
			}

			@Override
			public void setValueAt(Object value, int row, int col) {
				Detalle obj = lista.get(row);

				try {
					int n = Integer.parseInt(value.toString());
					if (n > 0) {
						boolean b = true;
						
						ArrayList<DetalleProducto> lst = Datos.getInstancia().getDetallesProducto().detallesPorProducto(obj.producto.getCodigo());

						for (DetalleProducto det : lst)
							if ((n - obj.cantidad) * det.getCantidad() > det.ingrediente.getCantidad())
								b = false;

						if (b) {
							for (DetalleProducto det : lst) {
								double t = (n - obj.cantidad) * det.getCantidad();
								det.ingrediente.setApartado(det.ingrediente.getApartado() + t);
								det.ingrediente.setCantidad(det.ingrediente.getCantidad() - t);
							}

							setTotal(total + (n - obj.cantidad) * obj.producto.getPrecio());
							obj.cantidad = n;
							fireTableRowsUpdated(row, row);
						} else {
							dlg.mostrarMensaje("No hay suficientes ingredientes.");
						}
					} else
						dlg.mostrarMensaje("Se requiere un numero superior a 0.");
				} catch (NumberFormatException ex) {
					dlg.mostrarMensaje("Valor invalido.");
				}
			}
			
			@Override
			public boolean isCellEditable(int row, int col) {
				return col == 2;
			}
		};
		
		dlg.getTblProductos().setModel(tmodelo);
		
		dlg.getBtAnadir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				ContSelecProducto contspro = new ContSelecProducto();
				Producto pr = contspro.mostrar(dlg);
				IngredienteDAO indao=Datos.getInstancia().getIngredientes();
				
				if (pr != null) {
					boolean b = true;
					
					ArrayList<DetalleProducto> lst = Datos.getInstancia().getDetallesProducto().detallesPorProducto(pr.getCodigo());

					for (DetalleProducto det : lst)
						if (det.getCantidad() > det.ingrediente.getCantidad())
							b = false;

					if (b) {
						setTotal(total + pr.getPrecio());
						lista.add(new Detalle(pr, 1));

						for (DetalleProducto det : lst) {
							double t = det.getCantidad();
							det.ingrediente.setApartado(det.ingrediente.getApartado() + t);
							det.ingrediente.setCantidad(det.ingrediente.getCantidad() - t);
							indao.actualizar(det.ingrediente);
						}

						int i = tmodelo.getRowCount();
						tmodelo.fireTableRowsInserted(i, i);
					} else {
						dlg.mostrarMensaje("No hay suficientes ingredientes.");
					}
				}
			}
		});
		
		dlg.getBtQuitar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				int i = dlg.getTblProductos().getSelectedRow();
				IngredienteDAO indao=Datos.getInstancia().getIngredientes();
				if (i >= 0) {
					Detalle obj = lista.get(i);
					ArrayList<DetalleProducto> lst = Datos.getInstancia().getDetallesProducto().detallesPorProducto(obj.producto.getCodigo());

					for (DetalleProducto det : lst) {
						double t = det.getCantidad();
						det.ingrediente.setApartado(det.ingrediente.getApartado() - t);
						det.ingrediente.setCantidad(det.ingrediente.getCantidad() + t);
					}

					setTotal(total - obj.producto.getPrecio() * obj.cantidad);
					
					for (DetalleProducto det : lst) {
						double t = det.getCantidad();
						det.ingrediente.setApartado(det.ingrediente.getApartado() - t);
						det.ingrediente.setCantidad(det.ingrediente.getCantidad() + t);
						indao.actualizar(det.ingrediente);
					}
					
					lista.remove(i);
					tmodelo.fireTableRowsDeleted(i, i);
				}
			}
		});
		
		
		dlg.getBtAceptar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				String cliente = dlg.getTxtCliente();
				if (cliente.isEmpty())
					dlg.mostrarMensaje("Ingrese el nombre del cliente.");
				else if (dlg.getTblProductos().getRowCount() == 0)
					dlg.mostrarMensaje("Debe Agregar Productos");
				else {
					DetalleOrdenDAO dodao = Datos.getInstancia().getDetallesOrden();
					OrdenDAO odao = Datos.getInstancia().getOrdenes();
					Orden or = odao.anadir(dlg.getTxtCliente(), total);
					
					for (Detalle det : lista)
						dodao.anadir(or, det.producto, det.cantidad);
					
					IngredienteDAO idao = Datos.getInstancia().getIngredientes();
					ArrayList<Ingrediente> ingredientes = idao.ingredientesGeneral();
					
					for (Ingrediente i : ingredientes) {
						i.setApartado(0);
						idao.actualizar(i);
					}
					
					dlg.mostrarMensaje("Orden Registrada");
					dlg.dispose();
				}
			}
		});
		
		dlg.getBtSalir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				IngredienteDAO idao = Datos.getInstancia().getIngredientes();
				ArrayList<Ingrediente> ingredientes = idao.ingredientesGeneral();
				
				for (Ingrediente i : ingredientes) i.setApartado(0);

				dlg.dispose();
			}
		});
		
		dlg.setModalityType(ModalityType.APPLICATION_MODAL);
		dlg.setVisible(true);
	}
	
	private void setTotal(double t) {
		total = t;
		dlg.getLblSubtotal().setText(String.format("Subtotal: %.2f", total));
	}
}
